package com.yanh.jcommon.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityScheme;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;


@Configuration
@RequiredArgsConstructor
@ConditionalOnClass(ApiDocInfoConfig.class)
public class SwaggerConfig {

    /**
     * API 文档信息属性
     */
    private final ApiDocInfoConfig apiDocInfo;
    @Bean
    public OpenAPI customOpenAPI() {
        var c=new Contact();
        c.setUrl(apiDocInfo.getUrl());
        c.setEmail(apiDocInfo.getEmail());
        c.setName(apiDocInfo.getName());
        return new OpenAPI()
                .info(new Info()
                        .title(apiDocInfo.getTitle())
                        .version(apiDocInfo.getVersion())
                        .description(apiDocInfo.getDescription())
                        .contact(new Contact()
                                .name(apiDocInfo.getContact().getName())
                                .url(apiDocInfo.getContact().getUrl())
                                .email(apiDocInfo.getContact().getEmail())
                        )
                        .license(new License().name(apiDocInfo.getLicense().getName())
                                .url(apiDocInfo.getLicense().getUrl())
                        ))

                // 配置全局鉴权参数-Authorize
                .components(new Components()
                        .addSecuritySchemes(HttpHeaders.AUTHORIZATION,
                                new SecurityScheme()
                                        .name(HttpHeaders.AUTHORIZATION)
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .scheme("Bearer")
                                        .bearerFormat("JWT")
                        )
                );

    }

    /**
     * 全局自定义扩展
     * <p>
     * 在OpenAPI规范中，Operation 是一个表示 API 端点（Endpoint）或操作的对象。
     * 每个路径（Path）对象可以包含一个或多个 Operation 对象，用于描述与该路径相关联的不同 HTTP 方法（例如 GET、POST、PUT 等）。
     */
//    @Bean
//    public GlobalOpenApiCustomizer globalOpenApiCustomizer() {
//        return openApi -> {
//            // 全局添加鉴权参数
//            if (openApi.getPaths() != null) {
//                openApi.getPaths().forEach((s, pathItem) -> {
//                    // 接口添加鉴权参数
//                    pathItem.readOperations()
//                            .forEach(operation ->
//                                    operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
//                            );
//                });
//            }
//        };
//    }
//    @Bean
//    public GlobalOpenApiCustomizer globalOpenApiCustomizer() {
//        return openApi -> {
//            // 全局添加鉴权参数
//            if (openApi.getPaths() != null) {
//                openApi.getPaths().forEach((s, pathItem) -> {
//                    // 登录接口/验证码不需要添加鉴权参数
//                    if (s.equals("/api/v1/auth/login") || s.equals("/api/v1/auth/captcha")) {
//                        return;
//                    }
//                    // 接口添加鉴权参数
//                    pathItem.readOperations()
//                            .forEach(operation ->
//                                    operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
//                            );
//                });
//            }
//        };
//    }
}